package com.example.firstspringboot.controller;

import com.example.firstspringboot.bean.Student;
import com.example.firstspringboot.utils.MyResult;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * <code>@RestController = @ResponseBody + @Controller</code>
 */
@RestController
@RequestMapping("/api/student")
public class StudentController {
    /**
     * 模拟数据库
     */
    private static List<Student> students;

    static {
        students = new ArrayList<>();
        students.add(new Student(2021001, "zwz"));
        students.add(new Student(2021002, "zz"));
    }

    private Student findById(Integer id) {
        for (Student student : students) {
            if (student.getId().equals(id)) {
                return student;
            }
        }
        return null;
    }

    /**
     * <p>url(Get): <code>localhost:8080/api/student/</code></p>
     * <code>@GetMapping("/") = @RequestMapping(value = "/", method = RequestMethod.GET)</code>
     */
    @GetMapping("/")
    public MyResult<List<Student>> getAllStudents() {
        MyResult<List<Student>> result = new MyResult<>();
        result.setResultCode(MyResult.OK);
        result.setMessage("查询成功");
        result.setData(students);
        return result;
    }

    /**
     * <p>url(Post): <code>localhost:8080/api/student/</code></p>
     * <p>请求 body->raw->json 传 json 对象</p>
     *
     * <pre>
     * {
     *  "id":2021001,
     *  "name":"zwz"
     * }
     * </pre>
     *
     * <p>如果 参数写成 <code>Integer id, String name</code> 就不能接收 json 数据（空指针异常）
     * 参数前注解 @RequestBody 表示可接收 json 数据（要求 POST 请求）</p>
     *
     * <div>
     *      <p>details:</p>
     *      <ul>
     *          <li>@RequestBody主要用来接收前端传递给后端的 json 字符串中的数据(请求体中的数据的)；</li>
     *          <li>GET方式无请求体，所以使用 @RequestBody 接收数据时，前端不能使用GET方式提交数据，而是用POST方式进行提交。</li>
     *          <li>在后端的同一个接收方法里，@RequestBody与 @RequestParam()可以同时使用，@RequestBody最多只能有一个，而 @RequestParam()可以有多个。</li>
     *      </ul>
     * </div>
     * <a href="https://blog.csdn.net/CPOHUI/article/details/106876158">参考资料-CSDN</a>
     */
    @PostMapping("/")
    public MyResult<Boolean> registers(@RequestBody Student student) {
        MyResult<Boolean> result = new MyResult<>();
        Boolean flag = findById(student.getId()) == null;
        result.setData(flag);
        if (flag) {
            result.setResultCode(MyResult.OK);
            result.setMessage("注册成功");
            students.add(student);
        } else {
            result.setResultCode(MyResult.ERROR);
            result.setMessage("注册失败，已存在\"" + student.getId() + "\"该id");
        }
        return result;
    }
}
